﻿using System;
using System.Windows;
using System.Collections;
using WTwitter.View;
using WTwitter.Model.UserData;
using WTwitter.ViewModel;
using OAuthLib;
using System.IO;
using System.Xml;
using System.Windows.Markup;
using System.Windows.Media;
using System.Windows.Media.Imaging;

namespace WTwitter {
	/// <summary>
	/// App.xaml の相互作用ロジック
	/// </summary>
	public partial class App : Application {

		protected override void OnStartup(StartupEventArgs e) {
			base.OnStartup(e);
			//オプションの読込
			var option = Option.Instance;

			//アプリケーションの実行ファイルのフォルダ
			var baseUri = Directory.GetParent(
				System.Reflection.Assembly.GetExecutingAssembly().Location).FullName;

			//選択されたスキン名（=フォルダ名）
			//まだ機能追加していないのでデフォルト限定
			var skinFolderName = "Default";
			if (System.IO.Directory.Exists(string.Format(@"{0}\Skins\{1}", baseUri, option.Skin))) {
				skinFolderName = option.Skin;
			}

			//スキンの読込
			ResourceDictionary rd = new ResourceDictionary();
			foreach (DictionaryEntry entry in this.Resources) {//既存のリソースに追加するため
				rd[entry.Key] = entry.Value;
			}

			rd.MergedDictionaries.Add(
				Application.LoadComponent(new Uri("/Resources/CommonTemplates.xaml", UriKind.Relative)) as ResourceDictionary);

			//スキンフォルダの共通スキンを読込（Skinsフォルダ直下は共通）
			foreach (var file in Directory.GetFiles(string.Format(@"{0}\Skins", baseUri), @"*.xaml")) {
				var theme = XamlReader.Load(XmlReader.Create(file)) as ResourceDictionary;
				rd.MergedDictionaries.Add(theme);
			}

			//選択されたスキンの読込
			foreach (var file in Directory.GetFiles(
				string.Format(@"{0}\Skins\{1}", baseUri, skinFolderName),
					@"*.xaml")) {
				var theme = XamlReader.Load(XmlReader.Create(file)) as ResourceDictionary;
				rd.MergedDictionaries.Add(theme);
			}

			this.Resources = rd;

			ViewFactory.Instance.Initialize();
			
			//ビューの初期化
			var viewModel = new MainWindowViewModel(option);

			var isSucceedInitialize = viewModel.Initialize();
			if (!isSucceedInitialize) {
				MessageBox.Show("初期化に失敗しました。時間をおいて再起動を試してみてください");
				return;
			}

			var mainWindow = new MainWindow(viewModel);
			mainWindow.DataContext = viewModel;

			EventHandler handler = null;
			handler = (sender, eArg) => {
				mainWindow.Close();
				viewModel.RequestClose -= handler;
			};
			viewModel.RequestClose += handler;

			mainWindow.Icon = BitmapFrame.Create(new Uri(baseUri + @"\Skins\Default\icons\32x32\chess.png"));

			//ウィンドウの表示
			mainWindow.Show();
		}
	}
}
